#pragma once
#include "google/protobuf/service.h"
#include <memory>
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/InetAddress.h>
#include <muduo/net/TcpConnection.h>
#include <string>
#include "mprpcapplication.h"
#include <functional>
#include <google/protobuf/descriptor.h>
#include <unordered_map>
#include "logger.h"
#include "zookeeperutil.h"


//框架提供的专门服务发布rpc服务的网络对象类

class RpcProvider {
public:
    //发布rpc网络服务
    void NotifyService(google::protobuf::Service *service);

    // 启动rpc服务节点，开始提供rpc远程调用服务
    void Run();
private:

    // 组合EventLoop   222
    muduo::net::EventLoop m_eventLoop;

    //service服务类型信息
    struct ServiceInfo {
        google::protobuf::Service *m_service;   //保存服务对象
        std::unordered_map<std::string, const google::protobuf::MethodDescriptor*> m_methodMap;  //保存服务方法
    };

    //存储注册成功的服务对象和服务方法的所有信息
    std::unordered_map<std::string, ServiceInfo> m_serviceMap;

    //新的socket的连接回调
    void OnConnection(const muduo::net::TcpConnectionPtr &coon);

    //已建立连接用户的读写事件回调  如果远程有一个rpc服务的请求，那么OnMessage方法就会响应
    void OnMessage(const muduo::net::TcpConnectionPtr &coon, muduo::net::Buffer*, muduo::Timestamp);

    //Closure的回调操作， 用于序列化rpc的响应和网络发送
    void SendRpcResponse(const muduo::net::TcpConnectionPtr&, google::protobuf::Message*);
};